home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / graphics / tiff / tools / tiffsplit.c < prev    next >
C/C++ Source or Header  |  1992-02-10  |  6KB  |  236 lines

  1. #ifndef lint
  2. static char rcsid[] = "$Header: /usr/people/sam/tiff/tools/RCS/tiffsplit.c,v 1.1 92/02/10 18:42:56 sam Exp $";
  3. #endif
  4.  
  5. /*
  6.  * Copyright (c) 1992 Sam Leffler
  7.  * Copyright (c) 1992 Silicon Graphics, Inc.
  8.  *
  9.  * Permission to use, copy, modify, distribute, and sell this software and 
  10.  * its documentation for any purpose is hereby granted without fee, provided
  11.  * that (i) the above copyright notices and this permission notice appear in
  12.  * all copies of the software and related documentation, and (ii) the names of
  13.  * Sam Leffler and Silicon Graphics may not be used in any advertising or
  14.  * publicity relating to the software without the specific, prior written
  15.  * permission of Sam Leffler and Silicon Graphics.
  16.  * 
  17.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  18.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  19.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  20.  * 
  21.  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  22.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  23.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  24.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  25.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  26.  * OF THIS SOFTWARE.
  27.  */
  28.  
  29. #include <stdio.h>
  30. #include "tiffio.h"
  31.  
  32. typedef    unsigned char u_char;
  33. typedef    unsigned short u_short;
  34. typedef    unsigned int u_int;
  35. typedef    unsigned long u_long;
  36.  
  37. #define    streq(a,b)    (strcmp(a,b) == 0)
  38. #define    CopyField(tag, v) \
  39.     if (TIFFGetField(in, tag, &v)) TIFFSetField(out, tag, v)
  40. #define    CopyField2(tag, v1, v2) \
  41.     if (TIFFGetField(in, tag, &v1, &v2)) TIFFSetField(out, tag, v1, v2)
  42. #define    CopyField3(tag, v1, v2, v3) \
  43.     if (TIFFGetField(in, tag, &v1, &v2, &v3)) TIFFSetField(out, tag, v1, v2, v3)
  44.  
  45. static    int ignore = 1;            /* if true, ignore read errors */
  46. static    char *filename;
  47. static    char fname[1024+1];
  48.  
  49. static    int tiffcp();
  50. static    newfilename();
  51. static    int cpStrips();
  52. static    int cpTiles();
  53.  
  54. main(argc, argv)
  55.     char *argv[];
  56. {
  57.     TIFF *in, *out;
  58.  
  59.     if (argc < 2) {
  60.         fprintf(stderr, "usage: tiffsplit input.tif [prefix]\n");
  61.         exit(-3);
  62.     }
  63.     if (argc > 2)
  64.         strcpy(fname, argv[2]);
  65.     in = TIFFOpen(filename = argv[1], "r");
  66.     if (in != NULL) {
  67.         do {
  68.             char path[1024+1];
  69.             newfilename();
  70.             strcpy(path, fname);
  71.             strcat(path, ".tif");
  72.             out = TIFFOpen(path, "w");
  73.             if (out == NULL)
  74.                 exit(-2);
  75.             if (!tiffcp(in, out))
  76.                 exit(-1);
  77.             TIFFClose(out);
  78.         } while (TIFFReadDirectory(in));
  79.         (void) TIFFClose(in);
  80.     }
  81.     exit(0);
  82. }
  83.  
  84. static
  85. newfilename()
  86. {
  87.     static int first = 1;
  88.     static long fnum;
  89.     static short defname;
  90.     static char *fpnt;
  91.  
  92.     if (first) {
  93.         if (fname[0]) {
  94.             fpnt = fname + strlen(fname);
  95.             defname = 0;
  96.         } else {
  97.             fname[0] = 'x';
  98.             fpnt = fname + 1;
  99.             defname = 1;
  100.         }
  101.         first = 0;
  102.     }
  103. #define    MAXFILES    676
  104.     if (fnum == MAXFILES) {
  105.         if (!defname || fname[0] == 'z') {
  106.             fprintf(stderr, "tiffsplit: too many files.\n");
  107.             exit(1);
  108.         }
  109.         fname[0]++;
  110.         fnum = 0;
  111.     }
  112.     fpnt[0] = fnum / 26 + 'a';
  113.     fpnt[1] = fnum % 26 + 'a';
  114.     fnum++;
  115. }
  116.  
  117. static int
  118. tiffcp(in, out)
  119.     TIFF *in, *out;
  120. {
  121.     short bitspersample, samplesperpixel, shortv;
  122.     u_long w, l;
  123.     float floatv;
  124.     char *stringv;
  125.     u_long longv;
  126.  
  127.     CopyField(TIFFTAG_SUBFILETYPE, longv);
  128.     CopyField(TIFFTAG_TILEWIDTH, w);
  129.     CopyField(TIFFTAG_TILELENGTH, l);
  130.     CopyField(TIFFTAG_IMAGEWIDTH, w);
  131.     CopyField(TIFFTAG_IMAGELENGTH, l);
  132.     CopyField(TIFFTAG_BITSPERSAMPLE, bitspersample);
  133.     CopyField(TIFFTAG_COMPRESSION, shortv);
  134.     CopyField(TIFFTAG_PREDICTOR, shortv);
  135.     CopyField(TIFFTAG_PHOTOMETRIC, shortv);
  136.     CopyField(TIFFTAG_THRESHHOLDING, shortv);
  137.     CopyField(TIFFTAG_FILLORDER, shortv);
  138.     CopyField(TIFFTAG_ORIENTATION, shortv);
  139.     CopyField(TIFFTAG_SAMPLESPERPIXEL, samplesperpixel);
  140.     CopyField(TIFFTAG_MINSAMPLEVALUE, shortv);
  141.     CopyField(TIFFTAG_MAXSAMPLEVALUE, shortv);
  142.     CopyField(TIFFTAG_XRESOLUTION, floatv);
  143.     CopyField(TIFFTAG_YRESOLUTION, floatv);
  144.     CopyField(TIFFTAG_GROUP3OPTIONS, longv);
  145.     CopyField(TIFFTAG_GROUP4OPTIONS, longv);
  146.     CopyField(TIFFTAG_RESOLUTIONUNIT, shortv);
  147.     CopyField(TIFFTAG_PLANARCONFIG, shortv);
  148.     CopyField(TIFFTAG_ROWSPERSTRIP, longv);
  149.     CopyField(TIFFTAG_XPOSITION, floatv);
  150.     CopyField(TIFFTAG_YPOSITION, floatv);
  151.     CopyField(TIFFTAG_IMAGEDEPTH, longv);
  152.     CopyField(TIFFTAG_TILEDEPTH, longv);
  153.     CopyField(TIFFTAG_MATTEING, shortv);
  154.     { u_short *red, *green, *blue;
  155.       CopyField3(TIFFTAG_COLORMAP, red, green, blue);
  156.     }
  157.     { u_short shortv2;
  158.       CopyField2(TIFFTAG_PAGENUMBER, shortv, shortv2);
  159.     }
  160.     CopyField(TIFFTAG_ARTIST, stringv);
  161.     CopyField(TIFFTAG_IMAGEDESCRIPTION, stringv);
  162.     CopyField(TIFFTAG_MAKE, stringv);
  163.     CopyField(TIFFTAG_MODEL, stringv);
  164.     CopyField(TIFFTAG_SOFTWARE, stringv);
  165.     CopyField(TIFFTAG_DATETIME, stringv);
  166.     CopyField(TIFFTAG_HOSTCOMPUTER, stringv);
  167.     CopyField(TIFFTAG_PAGENAME, stringv);
  168.     CopyField(TIFFTAG_DOCUMENTNAME, stringv);
  169.     if (TIFFIsTiled(in))
  170.         return (cpTiles(in, out));
  171.     else
  172.         return (cpStrips(in, out));
  173. }
  174.  
  175. static int
  176. cpStrips(in, out)
  177.     TIFF *in, *out;
  178. {
  179.     u_long bufsize  = TIFFStripSize(in);
  180.     u_char *buf = (u_char *)malloc(bufsize);
  181.  
  182.     if (buf) {
  183.         u_int s, ns = TIFFNumberOfStrips(in);
  184.         u_long *bytecounts;
  185.  
  186.         TIFFGetField(in, TIFFTAG_STRIPBYTECOUNTS, &bytecounts);
  187.         for (s = 0; s < ns; s++) {
  188.             if (bytecounts[s] > bufsize) {
  189.                 buf = (u_char *)realloc(buf, bytecounts[s]);
  190.                 if (!buf)
  191.                     return (0);
  192.                 bufsize = bytecounts[s];
  193.             }
  194.             if (TIFFReadRawStrip(in, s, buf, bytecounts[s]) < 0 ||
  195.                 TIFFWriteRawStrip(out, s, buf, bytecounts[s]) < 0) {
  196.                 free(buf);
  197.                 return (0);
  198.             }
  199.         }
  200.         free(buf);
  201.         return (1);
  202.     }
  203.     return (0);
  204. }
  205.  
  206. static int
  207. cpTiles(in, out)
  208.     TIFF *in, *out;
  209. {
  210.     u_long bufsize  = TIFFTileSize(in);
  211.     u_char *buf = (u_char *)malloc(bufsize);
  212.  
  213.     if (buf) {
  214.         u_int t, nt = TIFFNumberOfTiles(in);
  215.         u_long *bytecounts;
  216.  
  217.         TIFFGetField(in, TIFFTAG_TILEBYTECOUNTS, &bytecounts);
  218.         for (t = 0; t < nt; t++) {
  219.             if (bytecounts[t] > bufsize) {
  220.                 buf = (u_char *)realloc(buf, bytecounts[t]);
  221.                 if (!buf)
  222.                     return (0);
  223.                 bufsize = bytecounts[t];
  224.             }
  225.             if (TIFFReadRawTile(in, t, buf, bytecounts[t]) < 0 ||
  226.                 TIFFWriteRawTile(out, t, buf, bytecounts[t]) < 0) {
  227.                 free(buf);
  228.                 return (0);
  229.             }
  230.         }
  231.         free(buf);
  232.         return (1);
  233.     }
  234.     return (0);
  235. }
  236.